概述
固定集合是固定大小的集合,支持高吞吐量的基于插入顺序的插入和检索文档操作。固定集合使用一种类似循环缓冲区的方式进行工作。一旦集合填满了其分配的空间,那么新的文档将会覆盖集合中最老的文档。
创建固定集合可通过查看createCollection()
或者create
来查看更多信息。
行为
顺序插入
固定集合保证保存的插入顺序。因此,在顺序插入的时候返回文档不需要索引。
自动删除老文档
为新的文档腾出空间,固定集合会自动移除集合中最老的文档,而不用任何脚本或者明确的移除操作。例如, oplog.rs 集合在副本集中使用固定集合存储日志的操作。考虑以下固定集合的使用情形:
保存大容量系统生成的日志信息,在一个没有索引的固定集合中插入文档与直接在文件系统中写入日志信息所花费的时间非常接近。此外,内置的先入先出策略保证了事件的顺序,同时管理内存的使用。
在固定集合中缓存了少量的数据。由于是缓存是读取而不是大批量的写,you would either need to ensure that this collection always remains in the working set (即在RAM中) or accept some write penalty for the required index or indexes.
_id 索引
固定集合默认情况下有一个_id
字段和_id
字段索引。
限制和建议
更新
如果你计划在固定集合中更新文档,创建一个索引,这样更新操作不需要请求集合扫描。
文档大小
在3.2版本中改变
如果一个更新或者替换操作将会改变文档的大小,那么操作将会失败。
文档删除
你不能从一个固定集合中删除文档。从一个集合中移除所有的文档,使用drop()
方法来删除集合和重建固定集合。
分片
你不能分片一个固定集合。
查询效率
使用自然顺序从集合中高效的检索最近插入的元素。这(有点)类似于在一个日志文件上跟踪。
聚合$out
聚合管道操作$out
不能将结果写入到固定集合中。
程序
创建一个固定集合
你必须使用db.createCollection()
方法显式的创建一个固定集合。这是 Mongo Shell 一个创建命令,当创建一个固定集合的时候,你必须指定集合的最大值(以字节为单位),MongoDB将会对集合进行预先分配。这个固定集合的大小包含用于内部开销的少量空间:
db.createCollection( "log", { capped: true, size: 100000 } )
如果size
字段小于或者等于4096,然后集合的上限是4096字节。否则,MongoDB将会提升size
的大小为256的整倍数。
此外,你也可以在下面的文档使用max
字段为集合指定一个文档的最大值。
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
重要:即使你为文档指定最大值,
size
参数也是必须的。如果一个集合在达到最大文档数量之前,它的大小达到了最大值,那么MongoDB将会移除最老的文档.
查询固定集合
如果你想在一个固定集合中执行没有指定排序的find
命令。那么MongoDB保证查询出来的结果顺序跟插入顺序是相同的。
使用反向插入顺序检索文档,使用find()
方法带着$natural
参数设置为-1
的sort()
方法, 如以下示例所示:
db.cappedCollection.find().sort( { $natural: -1 } )
检测是否为固定集合
使用isCapped()
方法来判断一个集合是否是固定集合:
db.collection.isCapped()
将一个集合转化为固定集合
你可以使用convertToCapped
命令来将一个非固定集合转化为固定集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
在固定集合中size
参数指定的大小单位为字节。
警告:这个命令将获得全局写锁,并且将会阻止其他操作,直至命令完成。
在指定的时间之后自动移除数据
当数据过期之后,为了进一步增强灵活性,考虑到MongoDB的TTL索引。综上所述,集合通过设置TTL来过期数据。这些索引允许你从正常的集合中使用特定的类型,基于日期类型的字段值和TTL值索引来过期和移除数据。
TTL集合不兼容固定集合。
Tailable 游标
你可以在固定集合中使用Tailable 游标
,类似于Linux的tail -f
命令,Tailable 游标 会追踪
固定集合的末尾。作为新的文档插入到固定集合,你可以使用Tailable 游标
来继续检索文档。
在创建Tailable 游标
的时候可以查看Tailable 游标
来获取更多信息。
下一章:https://segmentfault.com/a/11...
本文链接:https://docs.mongodb.com/manu...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。